home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / L_CHSRC_ / ANALYSIS.C < prev    next >
Text File  |  1990-01-26  |  14KB  |  558 lines

  1. /********************************************************************************
  2.  *    analysis.c
  3.  *
  4.  *    Color Pair Analysis Package
  5.  *
  6.  *    Written by Paco Xander Nathan
  7.  *    ⌐1990, Motorola Inc.  Public domain source code.
  8.  ********************************************************************************/
  9.  
  10. #include "applic.h"
  11. #include "window.h"
  12. #include "dialog.h"
  13. #include "text.h"
  14. #include "string.h"
  15.  
  16. #include "test.h"
  17. #include "gnosis.h"
  18. #include "analysis.h"
  19.  
  20.  
  21. #define LINEHEIGHT    20
  22.  
  23.  
  24. /* External Data Structures
  25.  */
  26. GnosData
  27.     analGnosBuf;
  28.  
  29.  
  30. /* Local Data Structures
  31.  */
  32.  
  33.  
  34. /* Local Function Prototypes
  35.  */
  36. #ifdef PROTOTYPES
  37. #endif
  38.  
  39.  
  40. /* Analyze one pass through adjacent color pairings
  41.  */
  42. void
  43. AnalPass (thePass)
  44.     register WORD thePass;
  45. {
  46.     register WORD i;
  47.  
  48.     for (i = 0; i < MAXPAD; i++) {
  49.         analGnosBuf.color[thePass][testPad[i].order] = testPad[i].color - 2 + '0';
  50.  
  51.         if (analGnosBuf.color[thePass][testPad[i].order] == '8')
  52.             analGnosBuf.color[thePass][testPad[i].order] = '0';
  53.     }
  54. }
  55.  
  56.  
  57. /* Score matches between the two passes
  58.  */
  59. void
  60. AnalPairs ()
  61. {
  62.     register WORD i, j;
  63.  
  64.     /* Score each testPass1 pair by looking up its identical pair or transpose
  65.      * in testPass0
  66.      */
  67.     for (i = 0; i < (MAXPAD - 1); i++) {
  68.         analGnosBuf.pair[testPass1][i] = prDifferent;
  69.  
  70.         for (j = 0; j < (MAXPAD - 1); j++) {
  71.             if ((analGnosBuf.color[testPass1][i] == analGnosBuf.color[testPass0][j]) && (analGnosBuf.color[testPass1][i + 1] == analGnosBuf.color[testPass0][j + 1]))
  72.                 analGnosBuf.pair[testPass1][i] = prIdentical;
  73.             else if ((analGnosBuf.color[testPass1][i] == analGnosBuf.color[testPass0][j + 1]) && (analGnosBuf.color[testPass1][i + 1] == analGnosBuf.color[testPass0][j]))
  74.                 analGnosBuf.pair[testPass1][i] = prTranspose;
  75.         }
  76.     }
  77.     
  78.     /* Score each testPass0 pair by looking up its identical pair or transpose
  79.      * in testPass1
  80.      */
  81.     for (i = 0; i < (MAXPAD - 1); i++) {
  82.         analGnosBuf.pair[testPass0][i] = prDifferent;
  83.  
  84.         for (j = 0; j < (MAXPAD - 1); j++) {
  85.             if ((analGnosBuf.color[testPass0][i] == analGnosBuf.color[testPass1][j]) && (analGnosBuf.color[testPass0][i + 1] == analGnosBuf.color[testPass1][j + 1]))
  86.                 analGnosBuf.pair[testPass0][i] = prIdentical;
  87.             else if ((analGnosBuf.color[testPass0][i] == analGnosBuf.color[testPass1][j + 1]) && (analGnosBuf.color[testPass0][i + 1] == analGnosBuf.color[testPass1][j]))
  88.                 analGnosBuf.pair[testPass0][i] = prTranspose;
  89.         }
  90.     }
  91.  
  92.     analGnosBuf.pair[testPass0][MAXPAD - 1] = prDifferent;
  93.     analGnosBuf.pair[testPass1][MAXPAD - 1] = prDifferent;
  94. }
  95.  
  96.  
  97. /* Determine the marks for the given color test pass
  98.  */
  99. void
  100. AnalMarks (thePass)
  101.     register WORD thePass;
  102. {
  103.     register WORD i;
  104.  
  105.     /* Mark all the remaining with '='
  106.      */
  107.     for (i = 0; i < MAXPAD; i++)
  108.         analGnosBuf.mark[thePass][i] = '=';
  109.  
  110.     /* Last single or pair is '-'
  111.      */
  112.     i = MAXPAD - 1;
  113.     analGnosBuf.mark[thePass][i--] = '-';
  114.     
  115.     if (analGnosBuf.pair[thePass][i] != prDifferent)
  116.         analGnosBuf.mark[thePass][i] = '-';
  117.  
  118.     /* First single or pair is '+'
  119.      */
  120.     i = 0;
  121.     analGnosBuf.mark[thePass][i] = '+';
  122.  
  123.     if (analGnosBuf.pair[thePass][i] != prDifferent) {
  124.         i++;
  125.         analGnosBuf.mark[thePass][i] = '+';
  126.     }
  127.  
  128.     /* Second single or pair is 'x'; try to use this pair if possible to
  129.      * prevent fragmentation...
  130.      */
  131.     i++;
  132.     analGnosBuf.mark[thePass][i] = 'x';
  133.     
  134.     if (analGnosBuf.pair[thePass][i] != prDifferent) {
  135.         i++;
  136.         analGnosBuf.mark[thePass][i] = 'x';
  137.     }
  138. }
  139.  
  140.  
  141. /* Determine the anxiety marks for the given color test pass
  142.  */
  143. void
  144. AnalAngst (thePass)
  145.     register WORD thePass;
  146. {
  147.     register Boolean xFound = FALSE;
  148.     register WORD i, j;
  149.  
  150.     /* Clear the anxiety positions
  151.      */
  152.     analGnosBuf.total[thePass] = 0;
  153.  
  154.     for (i = 0; i < MAXPAD; i++) {
  155.         analGnosBuf.anxiety[thePass][i] = '╩';
  156.         analGnosBuf.stress[thePass][i] = '╩';
  157.     }
  158.  
  159.     /* Check for basic colors in the last three positions
  160.      */
  161.     for (i = MAXPAD - 3; i < MAXPAD; i++) {
  162.         if ((analGnosBuf.color[thePass][i] == '1') || (analGnosBuf.color[thePass][i] == '2') ||
  163.                 (analGnosBuf.color[thePass][i] == '3') || (analGnosBuf.color[thePass][i] == '4')) {
  164.             for (j = i; j < MAXPAD; j++) {
  165.                 analGnosBuf.mark[thePass][j] = '-';
  166.                 analGnosBuf.anxiety[thePass][j] = 'A';
  167.             }
  168.  
  169.             analGnosBuf.anxiety[thePass][0] = 'C';
  170.             analGnosBuf.stress[thePass][i] = i - MAXPAD + '4';
  171.             analGnosBuf.total[thePass] += i - MAXPAD + 4;
  172.         }
  173.     }
  174.  
  175.     /* Check for auxilliary colors in the first three positions
  176.      */
  177.     for (i = 0; i < 3; i++) {
  178.         if ((analGnosBuf.color[thePass][i] == '6') || (analGnosBuf.color[thePass][i] == '7') || (analGnosBuf.color[thePass][i] == '0')) {
  179.             for (j = i; j >= 0; j--) {
  180.                 analGnosBuf.mark[thePass][j] = '+';
  181.                 analGnosBuf.anxiety[thePass][j] = 'C';
  182.             }
  183.  
  184.             analGnosBuf.anxiety[thePass][MAXPAD - 1] = 'A';
  185.             analGnosBuf.stress[thePass][i] = '3' - i;
  186.             analGnosBuf.total[thePass] += 3 - i;
  187.         }
  188.     }
  189.     
  190.     /* Stick some 'x' into any holes
  191.      */
  192.     for (i = 0; i < MAXPAD; i++)
  193.         if (analGnosBuf.mark[thePass][i] == 'x')
  194.             xFound = TRUE;
  195.  
  196.     if (!xFound) {
  197.         for (i = 0; i < MAXPAD; i++) {
  198.             if (analGnosBuf.mark[thePass][i] == '=') {
  199.                 analGnosBuf.mark[thePass][i] = 'x';
  200.                 
  201.                 if (analGnosBuf.pair[thePass][i] != prDifferent) {
  202.                     i++;
  203.                     analGnosBuf.mark[thePass][i] = 'x';
  204.                 }
  205.  
  206.                 return;
  207.             }
  208.         }
  209.     }
  210. }
  211.  
  212.  
  213. /* Read a value from one cell of the Analysis window
  214.  */
  215. void
  216. AnalReadCell (phase, title, data)
  217.     register WORD phase;
  218.     register WORD title;
  219.     register UBYTE *data;
  220. {
  221.     register WORD i;
  222.     WORD itemNum, kind;
  223.     Rect bounds;
  224.     Handle theItem;
  225.     Str255 itemText;
  226.  
  227.     /* Retrieve the text from the dialog item
  228.      */
  229.     GetDItem(dPtrAnal, title + (phase * analTotal), &kind, &theItem, &bounds);
  230.     GetIText(theItem, itemText);
  231.  
  232.     /* Convert the data from a Str255
  233.      */
  234.     PtoCstr((char *) itemText);
  235.  
  236.     for (i = 0; i < MAXPAD; i++)
  237.         data[i] = itemText[i];
  238. }
  239.  
  240.  
  241. /* Write a value into one cell of the Analysis window
  242.  */
  243. void
  244. AnalWriteCell (phase, title, data)
  245.     register WORD phase;
  246.     register WORD title;
  247.     register UBYTE *data;
  248. {
  249.     register WORD i;
  250.     WORD itemNum, kind;
  251.     Rect bounds;
  252.     Handle theItem;
  253.     Str255 itemText;
  254.  
  255.     /* Convert the data into a Str255
  256.      */
  257.     for (i = 0; i < MAXPAD; i++)
  258.         itemText[i] = data[i];
  259.  
  260.     itemText[i] = 0;
  261.     CtoPstr((char *) itemText);
  262.  
  263.     /* Store the text into the dialog item
  264.      */
  265.     GetDItem(dPtrAnal, title + (phase * analTotal), &kind, &theItem, &bounds);
  266.     SetIText(theItem, itemText);
  267. }
  268.  
  269.  
  270. /* Read edited values from the Analysis window and put them into the gnosis data
  271.  * buffer
  272.  */
  273. void
  274. AnalReadWind ()
  275. {
  276.     WORD itemNum, kind;
  277.     Rect bounds;
  278.     Handle theItem;
  279.     Str255 itemText;
  280.     long theNum;
  281.     GrafPtr savePort;
  282.  
  283.     GetPort(&savePort);
  284.     SetPort(dPtrAnal);
  285.  
  286.     /* Get the colors for both test passes
  287.      */
  288.     AnalReadCell(testPass0, analColor, analGnosBuf.color[testPass0]);
  289.     AnalReadCell(testPass1, analColor, analGnosBuf.color[testPass1]);
  290.  
  291.     /* Get the pairings for both test passes
  292.      */
  293.     AnalReadCell(testPass0, analPair, analGnosBuf.pair[testPass0]);
  294.     AnalReadCell(testPass1, analPair, analGnosBuf.pair[testPass1]);
  295.  
  296.     /* Get the markings for both test passes
  297.      */
  298.     AnalReadCell(testPass0, analMark, analGnosBuf.mark[testPass0]);
  299.     AnalReadCell(testPass1, analMark, analGnosBuf.mark[testPass1]);
  300.     
  301.     /* Get the anxiety for both test passes
  302.      */
  303.     AnalReadCell(testPass0, analAnxiety, analGnosBuf.anxiety[testPass0]);
  304.     AnalReadCell(testPass1, analAnxiety, analGnosBuf.anxiety[testPass1]);
  305.     
  306.     /* Get the stress for both test passes
  307.      */
  308.     AnalReadCell(testPass0, analStress, analGnosBuf.stress[testPass0]);
  309.     AnalReadCell(testPass1, analStress, analGnosBuf.stress[testPass1]);
  310.  
  311.     /* Get the total stress for both test passes
  312.      */
  313.     GetDItem(dPtrAnal, analTotal, &kind, &theItem, &bounds);
  314.     GetIText(theItem, itemText);
  315.     StringToNum((StringPtr) itemText, &theNum);
  316.     analGnosBuf.total[testPass0] = theNum;
  317.  
  318.     GetDItem(dPtrAnal, analTotal * 2, &kind, &theItem, &bounds);
  319.     GetIText(theItem, itemText);
  320.     StringToNum((StringPtr) itemText, &theNum);
  321.     analGnosBuf.total[testPass1] = theNum;
  322.  
  323.     /* Get the title
  324.      */
  325.     GetDItem(dPtrAnal, analTitle, &kind, &theItem, &bounds);
  326.     GetIText(theItem, analGnosBuf.title);
  327.  
  328.     SetPort(savePort);
  329. }
  330.  
  331.  
  332. /* Write values from the gnosis data buffer into the Analysis window to allow them
  333.  * to be displayed and edited
  334.  */
  335. void
  336. AnalWriteWind ()
  337. {
  338.     WORD itemNum, kind;
  339.     Rect bounds;
  340.     Handle theItem;
  341.     long theNum;
  342.     Str255 itemText;
  343.     GrafPtr savePort;
  344.  
  345.     GetPort(&savePort);
  346.     SetPort(dPtrAnal);
  347.  
  348.     /* Show the colors for both test passes
  349.      */
  350.     AnalWriteCell(testPass0, analColor, analGnosBuf.color[testPass0]);
  351.     AnalWriteCell(testPass1, analColor, analGnosBuf.color[testPass1]);
  352.  
  353.     /* Show the pairings for both test passes
  354.      */
  355.     AnalWriteCell(testPass0, analPair, analGnosBuf.pair[testPass0]);
  356.     AnalWriteCell(testPass1, analPair, analGnosBuf.pair[testPass1]);
  357.  
  358.     /* Show the markings for both test passes
  359.      */
  360.     AnalWriteCell(testPass0, analMark, analGnosBuf.mark[testPass0]);
  361.     AnalWriteCell(testPass1, analMark, analGnosBuf.mark[testPass1]);
  362.     
  363.     /* Show the anxiety for both test passes
  364.      */
  365.     AnalWriteCell(testPass0, analAnxiety, analGnosBuf.anxiety[testPass0]);
  366.     AnalWriteCell(testPass1, analAnxiety, analGnosBuf.anxiety[testPass1]);
  367.     
  368.     /* Show the stress for both test passes
  369.      */
  370.     AnalWriteCell(testPass0, analStress, analGnosBuf.stress[testPass0]);
  371.     AnalWriteCell(testPass1, analStress, analGnosBuf.stress[testPass1]);
  372.  
  373.     /* Show the total stress for both test passes
  374.      */
  375.     GetDItem(dPtrAnal, analTotal, &kind, &theItem, &bounds);
  376.     NumToString((long) analGnosBuf.total[testPass0], (StringPtr) itemText);
  377.     SetIText(theItem, itemText);
  378.  
  379.     GetDItem(dPtrAnal, analTotal * 2, &kind, &theItem, &bounds);
  380.     NumToString((long) analGnosBuf.total[testPass1], (StringPtr) itemText);
  381.     SetIText(theItem, itemText);
  382.  
  383.     /* Show the title
  384.      */
  385.     GetDItem(dPtrAnal, analTitle, &kind, &theItem, &bounds);
  386.     SetIText(theItem, analGnosBuf.title);
  387.     SelIText(dPtrAnal, analTitle, 0, 255);
  388.  
  389.     SetPort(savePort);    
  390. }
  391.  
  392.  
  393. /* Move analysis data from the data buffer into the given prognosis record
  394.  */
  395. void
  396. AnalGetBuf (gnosPtr)
  397.     register GnosPtr gnosPtr;
  398. {
  399.     AnalReadWind();
  400.  
  401.     BlockMove(&analGnosBuf, gnosPtr, 
  402.         sizeof(GnosData) - sizeof(Handle) - sizeof(GnosPtr));
  403. }
  404.  
  405.  
  406. /* Move analysis data from the given prognosis record into the data buffer
  407.  */
  408. void
  409. AnalPutBuf (gnosPtr)
  410.     register GnosPtr gnosPtr;
  411. {
  412.     BlockMove(gnosPtr, &analGnosBuf, 
  413.         sizeof(GnosData) - sizeof(Handle) - sizeof(GnosPtr));
  414.  
  415.     AnalWriteWind();
  416. }
  417.  
  418.  
  419. /* Fill in the blanks
  420.  */
  421. void
  422. AnalStub ()
  423. {
  424.     register WORD thePass;
  425.     static char digits[] = "01234567";
  426.     static char blanks[] = "        ";
  427.  
  428.     /* Clear each analysis field
  429.      */
  430.     for (thePass = testPass0; thePass <= testPass1; thePass++) {
  431.         BlockMove(digits, analGnosBuf.color[thePass], MAXPAD);
  432.  
  433.         BlockMove(blanks, analGnosBuf.pair[thePass], MAXPAD);
  434.         BlockMove(blanks, analGnosBuf.mark[thePass], MAXPAD);
  435.         BlockMove(blanks, analGnosBuf.anxiety[thePass], MAXPAD);
  436.         BlockMove(blanks, analGnosBuf.stress[thePass], MAXPAD);
  437.  
  438.         analGnosBuf.total[thePass] = 0;    
  439.     }
  440.     
  441.     if (testUser)
  442.         StrGetChooser(analGnosBuf.title);
  443.     else
  444.         GetIndString(analGnosBuf.title, RSRCBASE, strUntitled);
  445. }
  446.  
  447.  
  448. /* Report the color pair analysis
  449.  */
  450. void
  451. AnalReport ()
  452. {
  453.     /* Run the Analysis tests and report them
  454.      */
  455.     AnalPairs();
  456.     AnalMarks(testPass0);
  457.     AnalMarks(testPass1);
  458.     AnalAngst(testPass0);
  459.     AnalAngst(testPass1);
  460.  
  461.     AnalWriteWind();
  462.  
  463.     WindSwitch(wPtrText, TRUE);
  464.     WindSwitch(dPtrAnal, TRUE);
  465. }
  466.  
  467.  
  468. /* Image a printed report of the Analysis window
  469.  */
  470. void
  471. AnalPrint (pageRect)
  472.     register Rect *pageRect;
  473. {
  474.     register InfoPtr infoPtr = (InfoPtr) GetWRefCon(wPtrGnos);
  475.     register WORD theLine = 2, column0, column1;
  476.     Str255 theText;
  477.  
  478.     AnalReadWind();
  479.     column0 = (pageRect->left / 3 * 2) + (pageRect->right / 3);
  480.     column1 = (pageRect->left / 3) + (pageRect->right / 3 * 2);
  481.  
  482.     pageRect->top += LINEHEIGHT;
  483.     MoveTo(pageRect->left, pageRect->top);
  484.  
  485.     GetIndString(theText, strsAnalyze, analFile);
  486.     DrawString(theText);
  487.     DrawString(infoPtr->fileName);
  488.  
  489.     GetIndString(theText, strsAnalyze, analTitle);
  490.     DrawString(theText);
  491.     DrawString(analGnosBuf.title);
  492.     
  493.     pageRect->top += LINEHEIGHT * 2;
  494.     MoveTo(pageRect->left, pageRect->top);
  495.  
  496.     GetIndString(theText, strsAnalyze, analColor);
  497.     DrawString(theText);
  498.     MoveTo(column0, pageRect->top);
  499.     DrawText(analGnosBuf.color[testPass0], 0, MAXPAD);
  500.     MoveTo(column1, pageRect->top);
  501.     DrawText(analGnosBuf.color[testPass1], 0, MAXPAD);
  502.  
  503.     pageRect->top += LINEHEIGHT;
  504.     MoveTo(pageRect->left, pageRect->top);
  505.  
  506.     GetIndString(theText, strsAnalyze, analPair);
  507.     DrawString(theText);
  508.     MoveTo(column0, pageRect->top);
  509.     DrawText(analGnosBuf.pair[testPass0], 0, MAXPAD);
  510.     MoveTo(column1, pageRect->top);
  511.     DrawText(analGnosBuf.pair[testPass1], 0, MAXPAD);
  512.     
  513.     pageRect->top += LINEHEIGHT;
  514.     MoveTo(pageRect->left, pageRect->top);
  515.  
  516.     GetIndString(theText, strsAnalyze, analMark);
  517.     DrawString(theText);
  518.     MoveTo(column0, pageRect->top);
  519.     DrawText(analGnosBuf.mark[testPass0], 0, MAXPAD);
  520.     MoveTo(column1, pageRect->top);
  521.     DrawText(analGnosBuf.mark[testPass1], 0, MAXPAD);
  522.     
  523.     pageRect->top += LINEHEIGHT;
  524.     MoveTo(pageRect->left, pageRect->top);
  525.  
  526.     GetIndString(theText, strsAnalyze, analAnxiety);
  527.     DrawString(theText);
  528.     MoveTo(column0, pageRect->top);
  529.     DrawText(analGnosBuf.anxiety[testPass0], 0, MAXPAD);
  530.     MoveTo(column1, pageRect->top);
  531.     DrawText(analGnosBuf.anxiety[testPass1], 0, MAXPAD);
  532.     
  533.     pageRect->top += LINEHEIGHT;
  534.     MoveTo(pageRect->left, pageRect->top);
  535.  
  536.     GetIndString(theText, strsAnalyze, analStress);
  537.     DrawString(theText);
  538.     MoveTo(column0, pageRect->top);
  539.     DrawText(analGnosBuf.stress[testPass0], 0, MAXPAD);
  540.     MoveTo(column1, pageRect->top);
  541.     DrawText(analGnosBuf.stress[testPass1], 0, MAXPAD);
  542.  
  543.     pageRect->top += LINEHEIGHT;
  544.     MoveTo(pageRect->left, pageRect->top);
  545.  
  546.     GetIndString(theText, strsAnalyze, analTotal);
  547.     DrawString(theText);
  548.     MoveTo(column0, pageRect->top);
  549.     NumToString((long) analGnosBuf.total[testPass0], theText);
  550.     DrawString(theText);
  551.     MoveTo(column1, pageRect->top);
  552.     NumToString((long) analGnosBuf.total[testPass1], theText);
  553.     DrawString(theText);
  554.     
  555.     pageRect->top += LINEHEIGHT * 2;    
  556. }
  557.  
  558.